//聊天会话成员表映射对象
#pragma once
#include <string>
#include <cstddef> 
#include <odb/nullable.hxx>
#include <odb/core.hxx>
#include <boost/date_time/posix_time/posix_time.hpp>

// odb -d mysql --std c++11 --generate-query --generate-schema --profile boost/date-time message.hxx
namespace xchat
{

#pragma db object table("message")
class Message
{
public:
    Message() {}
    
    Message(const std::string &mid, const std::string &ssid, const std::string &uid,
            unsigned char mtype, const boost::posix_time::ptime &ctime)
            : _message_id(mid), _session_id(ssid), _user_id(uid), _message_type(mtype), _create_time(ctime)
    {}

    std::string message_id() const { return _message_id; }
    void message_id(const std::string &mid) { _message_id = mid; }

    std::string session_id() const { return _session_id; }
    void session_id(const std::string &ssid) { _session_id = ssid; }

    std::string user_id() const { return _user_id; }
    void user_id(const std::string &uid) { _user_id = uid; }

    unsigned char message_type() const { return _message_type; }
    void message_type(unsigned char mtype) { _message_type = mtype; }

    boost::posix_time::ptime create_time() const { return _create_time; }
    void create_time(const boost::posix_time::ptime &ctime) { _create_time = ctime; }

    std::string content() const 
    { 
        if(!_content) return std::string();
        return *_content; 
    }
    void content(const std::string &content) { _content = content; }

    std::string file_id() const
    {
        if(!_file_id) return std::string();
        return *_file_id; 
    }
    void file_id(const std::string &file_id) { _file_id = file_id; }

    std::string file_name() const
    {
        if(!_file_name) return std::string();
        return *_file_name;
    }
    void file_name(const std::string &file_name) { _file_name = file_name; }

    unsigned int file_size() const
    {
        if(!_file_size) return 0;
        return *_file_size;
    }
    void file_size(unsigned int file_size) { _file_size = file_size; }

private:
    friend class odb::access;
    #pragma db id auto
    unsigned long _id;

    #pragma db type("varchar(64)") index unique
    std::string _message_id;    
    #pragma db type("varchar(64)") index
    std::string _session_id;                        //所属会话ID
    #pragma db type("varchar(64)")                  //一个用户可以多个会话 不能为空
    std::string _user_id;                           //发送者id
    unsigned char _message_type;                    //消息类型 0文本 1图像  3语音 
    #pragma db type("TIMESTAMP")
    boost::posix_time::ptime _create_time;          //创建时间

    odb::nullable<std::string> _content;            //文本消息内容 非文本可以忽略 0文本
    #pragma db type("varchar(64)")     
    odb::nullable<std::string> _file_id;            //文件消息的文件id  文本消息忽略 1图像 2文件 3语音 
    #pragma db type("varchar(128)")     
    odb::nullable<std::string> _file_name;          //文件消息的文件id 只对文件有效 2文件
    odb::nullable<unsigned int> _file_size;         //文件消息的大小 只对文件有效 2文件
};
}